博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
summernote(富文本编辑器)将附件与图片上传到自己的服务器(vue项目)
阅读量:6136 次
发布时间:2019-06-21

本文共 7159 字,大约阅读时间需要 23 分钟。

1.上传图片至自己的服务器(这个官方都有例子,重点介绍附件上传)

// onChange callback$('#summernote').summernote({  callbacks: {    onChange: function(contents, $editable) {      console.log('onChange:', contents, $editable);    }  }});// summernote.change$('#summernote').on('summernote.change', function(we, contents, $editable) {  console.log('summernote\'s content is changed.');})

summernote是一款富文本编辑器,但是他上传的图片的时候,图片会以二进制的形式存入数据库字段中,这时候就很占资源,所以我们希望图片能存入自己的服务器,在字段中就以链接地址的形式存放,这时候就需要在上传图片的时候进行处理,所以callbacks下面的onImageUpload进行图片文件的处理。

示例

//初始化定义        var _this=this;        this.curEle=$('#'+this.id);        var fileUploadBtn=this.template;        this.curEle.summernote({          focus: true,          lang:'zh-CN', //中文说明配置          placeholder:'请输入内容',          fontNames: ['宋体','微软雅黑','楷体','黑体','隶书', 'Arial', 'Arial Black', 'Comic Sans MS', 'Courier New',            'Helvetica Neue', 'Helvetica', 'Impact', 'Lucida Grande',            'Tahoma', 'Times New Roman', 'Verdana'],          height:400,          minHeight:300,          maxHeight:null,          toolbar: [            ['style', ['style']],            ['font', ['bold', 'italic', 'underline', 'clear']],            ['fontname', ['fontname']],            ['color', ['color']],            ['para', ['ul', 'ol', 'paragraph','height']],            ['table', ['table']],            ['insert', ['fileBtn','media', 'link', 'picture', 'video']],            ['view', ['fullscreen']]          ],          buttons: {            fileBtn: fileUploadBtn          },          callbacks: {            onImageUpload: function (files,editor, $editable) {              _this.sendFile(files[0]);            },                      }        })
methods:{ sendFile(files){        var _this=this;        var data = new FormData();        data.append("file", files);        $.ajax({            data : data,            type : "POST",            url : SERVICE_URLS.commonUrl.uploadPic.path, //此处为图片上传服务器请求地址,返回的是图片上传后的路径(例如:请求接口为http://120.96.35.20:8090/uploadPic)            cache : false,            contentType : false,            processData : false,            dataType : "json",            success: function(data) {//举例data:{data:'http://www.test.com/a.jpg'}                 _this.curEle.summernote('insertImage', data.data);            },            error:function(){                alert("上传失败");            }        });    },    template(context){  //此处为自定义附件上传按钮,如果只考虑图片上传请忽略          let _this=this;          var ui = $.summernote.ui;          // create button          var button = ui.button({            contents: ' 附件',            tooltip: '文件上传',            click: function () {              _this.visibleUpload=true; //控制上传文件界面框可见性              setTimeout(function(){                _this.initUploader(); //初始化web uploader插件              },0)                         }          });          return button.render();   // return button as jquery object        }}

2.自定义创建附件按钮,上传至自己服务器。

首先介绍github上已经存在的附件插件

uploadcare-summernote

这是Summernote WYSIWYG编辑器的Uploadcare插件。它允许您的用户从本地设备,社交网络,云存储上传文件和图像,而无需处理上传所需的任何后端代码。这句话意味着你上传的文件存储的位置不在你自己的服务器上。

当然插件提供了,有兴趣的可以自己尝试。综合考虑插件的方法有点繁琐不安全,不如自己写个附件上传按钮。

示例如下

(1)创建自己的附件上传按钮 , 如上template函数所示:

clipboard.png

(2)上传附件,此处用百度的插件,具体代码不在细讲(可看web uploader API)
(3)根据返回的数据,动态创建DOM插入到summerNote编辑器中。
这里重点说一下思路:
1.利用插件将本地文件上传到我们的服务器
2.当上传完成后(uploadFinished),我们可根据成功返回的数据,动态的创建DOM对象。
3.将创建好的DOM对象,再插入到编辑器中
(注意:这里不用insertNode方法,因为他会额外的<p><br></p>标签--具体查看,另外当选取本地文件的时候,此时的富文本编辑器会失去焦点,插入新的node节点的时候,总是从起始点开始插入,而非从当前光标的位置进行插入。所以尝试换种方法,利用设置code重新置换整个编辑框的内容。)

clipboard.png

initUploader(){          var _this=this;          var $list=$('#uploadList');          var state='pending';          var $btn=$('#toServerBtn');          var uploader = WebUploader.create({            swf: 'https://cdn.bootcss.com/webuploader/0.1.1/Uploader.swf',            server: SERVICE_URLS.commonUrl.uploadFile.path,  //自己服务器的文件上传接口            pick: '#fileUpload',            resize: false,            fileNumLimit: 10,            fileSizeLimit: 10 * 1024 * 1024,          });          this.uploader=uploader;          // 当有文件被添加进队列的时候          uploader.on( 'fileQueued', function( file ) {            $list.append( '
  • ' + '

    ' + file.name + '

    ' + '
    ' + '

    等待上传

    ' + '

    取消上传

    ' + '
    '+ '
    ' + '
    ' + '
    '+ '
  • ' ); if(file){ _this.ifFileQueue=true; } }); $list.on('click','.stateBox .cancelFile',function(event){ var target=event.target.getAttribute('attr'); uploader.removeFile( target,true ); $('#'+target).remove(); var status=uploader.getStats(); if(status.queueNum==0){ _this.ifFileQueue=false }else{ _this.ifFileQueue=true; } }) uploader.on( 'uploadProgress', function( file, percentage ) { var $li = $( '#'+file.id ), $percent = $li.find('.progress .progress-bar'); // 避免重复创建 if ( !$percent.length ) { $percent = $('
    ' + '
    ' + '
    ' + '
    ').appendTo( $li ).find('.progress-bar'); } $li.find('p.uploadState').text('上传中'); $percent.css( 'width', percentage * 100 + '%' ); }); uploader.on( 'uploadSuccess', function( file,response ) { $( '#'+file.id ).find('p.uploadState').text('已上传'); _this.$set( _this.fileList,_this.fileList.length,response.result[0]) }); uploader.on( 'uploadError', function( file ) { $( '#'+file.id ).find('p.uploadState').text('上传出错'); }); uploader.on( 'uploadComplete', function( file ) { $( '#'+file.id ).find('.progress').fadeOut(); }); uploader.on('uploadFinished',function(){ //重点在这里 var str=``; for (var i = 0; i < _this.fileList.length; i++) { var item = _this.fileList[i]; str+=`

    ${item.fileName}

    `; } var storageCode=_this.curEle.summernote('code'); _this.curEle.summernote('reset'); var node=$("
    "+storageCode+str+"
    ")[0];// _this.curEle.summernote('insertNode',node); //此处不用insertNode _this.curEle.summernote('code',node); setTimeout(()=>{ _this.visibleUpload=false; },1000) }); uploader.on( 'all', function( type ) { if ( type === 'startUpload' ) { state = 'uploading'; } else if ( type === 'stopUpload' ) { state = 'paused'; } else if ( type === 'uploadFinished' ) { state = 'done'; } if ( state === 'uploading' ) { $btn.text('暂停上传'); } else { $btn.text('开始上传'); } }); $btn.on( 'click', function() { if ( state === 'uploading' ) { uploader.stop(); } else { uploader.upload(); } }); },

    clipboard.png

    代码没有写全,只是提供思路。

    转载地址:http://hleua.baihongyu.com/

    你可能感兴趣的文章
    Vue模板、JS、CSS分离实现
    查看>>
    Hexo -- 快速、简洁且高效的博客框架 入门
    查看>>
    JVM
    查看>>
    高并发面试总结
    查看>>
    Pycharm--Python文件开头自动添加utf-8编码
    查看>>
    Leetcode PHP题解--D60 824. Goat Latin
    查看>>
    2019年一线大厂春招:Spring面试题和答案合集(上篇)
    查看>>
    尚未弄懂的JS系列(未完待续)
    查看>>
    浅析Java NIO
    查看>>
    企业级 SpringBoot 教程 (一)构建第一个SpringBoot工程
    查看>>
    学习云计算技术前景在哪里?云计算技术发展趋势
    查看>>
    干货|比特币如何产生与交易
    查看>>
    前端处理后端接口传递过来的图片文件
    查看>>
    react中的可控组件与非可控组件
    查看>>
    Android基础—四大组件之Activity
    查看>>
    Nginx 学习笔记
    查看>>
    你为什么选择程序员这个职业?
    查看>>
    [译] 用于 iOS 的 ML Kit 教程:识别图像中的文字
    查看>>
    有关https的SSL加密方式
    查看>>
    ES6的开发环境搭建
    查看>>